# coding=utf-8
array = [x * x for x in range(1, 11)]
print(array)
'''
通过列表生成式，我们可以直接创建一个列表。但是，受到内存限制，列表容量肯定是有限的。而且，创建一个包含100万个元素的列表，不仅占用很大的存储空间，
如果我们仅仅需要访问前面几个元素，那后面绝大多数元素占用的空间都白白浪费了。
所以，如果列表元素可以按照某种算法推算出来，那我们是否可以在循环的过程中不断推算出后续的元素呢？这样就不必创建完整的list，从而节省大量的空间。
在Python中，这种一边循环一边计算的机制，称为生成器：generator。
要创建一个generator，有很多种方法。第一种方法很简单，只要把一个列表生成式的[]改成()，就创建了一个generator：
'''
array = (x * x for x in range(1, 11))
for n in array:
    print(n)


# 斐波拉契数列
# 这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字，那么这个函数就不再是一个普通函数，而是一个generator：
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1


for a in fib(6):
    print(a)


# 变成generator的函数，在每次调用next()的时候执行，遇到yield语句返回，再次执行时从上次返回的yield语句处继续执行。
# 举个简单的例子，定义一个generator，依次返回数字1，3，5：
def odd():
    print("step  1")
    yield 1
    print("step  2")
    yield 2
    print("step  3")
    yield 3


for item in odd():
    print(item)


# 小练习：杨辉三角定义如下：
#           1
#          / \
#         1   1
#        / \ / \
#       1   2   1
#      / \ / \ / \
#     1   3   3   1
#    / \ / \ / \ / \
#   1   4   6   4   1
#  / \ / \ / \ / \ / \
# 1   5   10  10  5   1
# 把每一行看做一个list，试写一个generator，不断输出下一行的list：
'''
def triangles(line):
    i = 1
    array_all = []
    while i <= line:
        y = 1
        arr = []
        while y <= i:
            if y == 1:
                arr.append(1)
            elif y == i:
                arr.append(1)
            else:
                arr.append(array_all[i - 2][y - 1] + array_all[i - 2][y - 2])
            y = y + 1
        array_all.append(arr)
        yield arr
        i = i + 1
'''


# 模仿
def triangles(line):
    source = [1]
    i = 0
    while i < line:
        yield source
        copy = source
        copy.append(0)
        source = [copy[y - 1] + copy[y] for y in range(len(copy))]
        i = i + 1


print('\n\n杨辉三角定义')
for item in triangles(12):
    print(item)


# 别人的答案
'''
def triangles():
    N = [1]
    while True:
        yield N
        S=N[:]
        S.append(0)
        N = [S[i-1] + S[i] for i in range(len(S))]


for a in triangles():
    print(a)
'''